home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
games
/
ippon
/
source.lzh
/
FuncEnemy
/
zako031.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-07-07
|
2KB
|
118 lines
/* zako031.c 破壊すると炸裂弾を発射するザコ */
#include <xsp2lib.h>
#include "../main.h"
#include "../player.h"
#include "../enemy.h"
#include "../eshot.h"
#include "../effect.h"
#include "../psearch.h"
#include "../sound.h"
#define PALET_MAIN 0x0600
#define SPEED_1 6 /* 速度 */
/* 関数プロトタイプ宣言 */
static short EnemyMoveZako031 (ENEMY *);
static void EnemyFreeZako031 (ENEMY *);
/* 初期化ルーチン */
void EnemyAllocZako031 (ENEMY * p)
{
if (player->x < 144)
p->lx = 144 * 65536 + p->lx;
else
p->lx = 144 * 65536 - p->lx;
p->vx = xytable[SPEED_1][p->angle].x;
p->vy = xytable[SPEED_1][p->angle].y;
p->pt = obj_zako03;
p->info = PALET_MAIN | PRIORITY_ZAKO;
p->angle = psearch (SHORT_LX, SHORT_LY);
p->hit_sx = 12;
p->hit_sy = 12;
p->hp = 1; /* 耐久力 */
p->damage = 0;
p->damage_mode = DAMAGE_THROUGH;
p->func_enemy_move = EnemyMoveZako031;
p->func_enemy_free = EnemyFreeZako031;
/* コア関連 */
p->core_info = PALET_CORE_RED | PRIORITY_ZAKO;
p->core_pt = sp_core;
p->m_work = p->m_work2 = 0;
}
/* 移動ルーチン */
/* 返り値:非0なら消去 */
static short EnemyMoveZako031 (ENEMY * p)
{
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
p->x = (p->lx += p->vx) >> 16;
p->y = (p->ly += p->vy) >> 16;
switch (p->m_work) {
case 0:
if (p->m_work2++ > 30) {
p->m_work++;
p->m_work2 = 0;
p->m_work3 = 0;
}
break;
case 1:
if (p->m_work2++ > 30) {
p->m_work2 = 0;
p->angle = psearch (p->x, p->y);
p->vx = xytable[SPEED_1][p->angle].x;
p->vy = xytable[SPEED_1][p->angle].y;
if (p->m_work3++ > 3)
p->m_work++;
}
break;
case 2:
/* 画面外に出たら消去 */
/* (画面左右から出た判定と上下から出た判定を1回ずつの比較で行っている) */
if ((SHORT_LX > 256 + 32) || (SHORT_LY > 256 + 32))
return (-1); /* 消去 */
break;
}
/* もし前回ダメージを受けたなら */
if (p->damage) {
p->damage = 0;
EffectAlloc (EFFECT_EXPLZAKO, 0, p->x, p->y); /* 爆発パターンを出現させる */
EffectAlloc (EFFECT_POINTS, points_table[p->shot_count], p->x, p->y); /* 得点を出現させる */
SoundSetSE (SE_EXPL); /* ザコ爆発音 */
return (-1);
}
xobj_set_st (p); /* 表示 */
/* コアの表示 */
p->core_x = p->x - 8;
p->core_y = p->y - 8;
xsp_set_st (&(p->core_x));
return (0);
}
/* 消去ルーチン */
static void EnemyFreeZako031 (ENEMY * p)
{
short h;
unsigned char a = 0;
#define SPEED_SHOT2_3 6
for (h = 0; h < 16; h++)
EshotAlloc (ESHOT_NRG23, SHORT_LX, SHORT_LY, SPEED_SHOT2_3, a += 16, 0);
}